/**
 * 
 */
package com.bbva.kyfb.kyfbutils.errores;

import java.util.Collection;
import java.util.Map;
import java.util.Set;

import javax.validation.ConstraintViolation;
import javax.validation.Validation;
import javax.validation.Validator;

import org.apache.commons.collections.CollectionUtils;

import com.bbva.jee.arq.spring.core.gce.CodigoError;
import com.bbva.jee.arq.spring.core.gce.ExcepcionEjecucionAplicacion;
import com.bbva.jee.arq.spring.core.log.I18nLog;
import com.bbva.jee.arq.spring.core.log.I18nLogFactory;

/**
 * The Class ValidationUtils.
 *
 * @author xe20973
 */
public final class ValidationUtils {

	/** Variable LOG. */
	private static final I18nLog LOG = I18nLogFactory.getLogI18n(ValidationUtils.class);

	private static final Validator VALIDATOR = Validation.buildDefaultValidatorFactory().getValidator();

	/**
	 * Validate.
	 *
	 * @param toValidate the to validate
	 * @param codigoError the codigo error
	 */
	public static void validate(final Object toValidate, final CodigoError codigoError) {
		final Set<ConstraintViolation<Object>> violations = VALIDATOR.validate(toValidate);
		if(CollectionUtils.isNotEmpty(violations)) {
			for (final ConstraintViolation<Object> violation : violations) {
				LOG.error(new StringBuilder().append(violation.getLeafBean()).append(" . ").append(violation.getPropertyPath()).append(" : ").append(violation.getInvalidValue()).append(" -> ").append(violation.getMessage()).toString());
			}
			throw new ExcepcionEjecucionAplicacion(codigoError);
		}
	}

	/**
	 * Validar obligatorios.
	 *
	 * @param datos the datos
	 * @param error the error
	 * @param validateBlankStrings the validateBlankStrings
	 */
	public static void validarObligatorios(final Object[] datos, final CodigoError error, final boolean validateBlankStrings) {

		for (final Object dato : datos) {

			if (dato == null) {
				throw new ExcepcionEjecucionAplicacion(error);
			}

			if (dato instanceof Collection<?>) {
				if (((Collection<?>)dato).isEmpty()) {
					throw new ExcepcionEjecucionAplicacion(error);
				}
			}

			if (dato instanceof Map<?,?>) {
				if (((Map<?,?>)dato).isEmpty()) {
					throw new ExcepcionEjecucionAplicacion(error);
				}
			}

			if (validateBlankStrings && dato instanceof String) {
				if (((String) dato).trim().isEmpty()) {
					throw new ExcepcionEjecucionAplicacion(error);
				}
			}
		}
	}

	/*
	private static Map<String, Object> introspect(final Object bean, final String[] names) throws Exception{
		final Map<String, Object> result = new HashMap<String, Object>();
		final BeanInfo info = Introspector.getBeanInfo(bean.getClass());
		Arrays.sort(names);
		int pos;
		info.getBeanDescriptor().
		for (final PropertyDescriptor pd : info.getPropertyDescriptors()) {
			//Buscamos si tenemos la propiedad
			pos = Arrays.binarySearch(names, pd.getName().substring(3));
			if (pos < 0){//Si no la encontramos probamos con el primer caracter en mayuscula
				pos = Arrays.binarySearch(names, pd.getName().substring(3,4).toUpperCase()+pd.getName().substring(4));
			}
			if(pos >= 0) {//Si esta
				final Method reader = pd.getReadMethod();
				if (reader != null){//extraemos el valor y lo guardamos en la propiedad con el nombre dado como key
					result.put(names[pos], reader.invoke(bean));
				}
			}
		}
		return result;
	}
	 */
}
